home *** CD-ROM | disk | FTP | other *** search
/ Programming a Multiplayer FPS in DirectX / Programming a Multiplayer FPS in DirectX (Companion CD).iso / DirectX / dxsdk_oct2004.exe / dxsdk.exe / Utilities / Content Creation Tool Plug-Ins / Maya / Sources / PreviewPipeline.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2004-09-27  |  13.5 KB  |  677 lines

  1. #include "dxstdafx.h"
  2. #include "PreviewPipeline.h"
  3.  
  4.  
  5. HRESULT CPipeline::Create() 
  6.     LPDXCCRESOURCE pResource= NULL;
  7.     pPreviewEngine= NULL;
  8.     fTime= 0;
  9.     DXCCCreateManager(&pDXCCManager);
  10.     DXCCCreateFrame(&pDXCCRoot);
  11.     pDXCCManager->CreateResource(pDXCCRoot, IID_IDXCCFrame, TRUE, &pResource);
  12.     pResource->SetName("DXCC_ROOT");
  13.     DXCC_RELEASE(pResource);
  14.  
  15.     ReadWriteMutex= CreateMutexA(NULL, FALSE, "DXCCPipeline_SceneReadWriteLock");
  16.     InitializeCriticalSection(&ZeroSceneReadersSection);
  17.     SceneReadersCount= 0;
  18.     ZeroSceneReadersEvent= CreateEventA(NULL, TRUE, TRUE, "DXCCPipeline_ZeroReaders");
  19.  
  20.     return S_OK; 
  21. }
  22.  
  23. HRESULT CPipeline::Destroy() 
  24.  
  25.     DXCC_RELEASE(pDXCCRoot);
  26.     DXCC_RELEASE(pDXCCManager);
  27.     CloseHandle(ReadWriteMutex);
  28.     ReadWriteMutex= NULL;
  29.     CloseHandle(ZeroSceneReadersEvent);
  30.     ZeroSceneReadersEvent= NULL;
  31.     DeleteCriticalSection(&ZeroSceneReadersSection);
  32.         
  33.     return S_OK; 
  34. }
  35.  
  36. HRESULT CPipeline::SetEngine( CPipelineEngine* pPreviewPipelineEngine )  
  37.     TriggerDeviceEvents.OnD3DDeviceDestroy();
  38.     pPreviewEngine= pPreviewPipelineEngine; 
  39.     TriggerDeviceEvents.OnD3DDeviceCreate();
  40.     return S_OK;
  41. }
  42.  
  43.  
  44.  
  45. void CPipeline::SetTime(float time) 
  46. {
  47.     fTime= time;
  48. }
  49.  
  50. float CPipeline::GetTime() 
  51. {
  52.     return fTime;
  53. }
  54.  
  55. CPipelineEngine* 
  56. CPipeline::AccessEngine()
  57. {
  58.     return pPreviewEngine;
  59. }
  60.  
  61. LPDXCCMANAGER
  62. CPipeline::AccessManager()
  63. {
  64.     return pDXCCManager;
  65. }
  66.  
  67. LPDXCCFRAME 
  68. CPipeline::AccessRoot()
  69. {
  70.     return pDXCCRoot;
  71. }
  72.  
  73.  
  74. bool CPipeline::SceneWriteLock(BOOL WaitForLock, CPipelineLock& Lock) 
  75. {
  76.     if(Lock.isLocked()==false)
  77.     {
  78.         if(GetSingleObject(WaitForLock, ReadWriteMutex))
  79.         {
  80.             if(GetSingleObject(WaitForLock, ZeroSceneReadersEvent))
  81.             {
  82.                 Lock.Locked=true;
  83.                 Lock.Type=CPipelineLock::TYPE_SCENE_WRITE;
  84.                 Lock.pPreviewPipeline=this;
  85.                 return true;
  86.             }
  87.             else
  88.             {
  89.                 ReleaseMutex(ReadWriteMutex);
  90.                 return false;
  91.             }
  92.         }
  93.         else
  94.             return false;
  95.     }
  96.     else
  97.         return false;
  98. }
  99.     
  100. void CPipeline::SceneWriteUnlock(CPipelineLock& Lock) 
  101. {
  102.     if(Lock.isLocked()==true && Lock.ofType()==CPipelineLock::TYPE_SCENE_WRITE)
  103.     {
  104.         Lock.Locked=false;
  105.         Lock.pPreviewPipeline=NULL;
  106.  
  107.         ReleaseMutex(ReadWriteMutex);
  108.     }
  109. }
  110. CPipelineLock::CPipelineLock(bool AutoUnlock)
  111. {
  112.     Type=TYPE_NONE; 
  113.     Locked=false; 
  114.     UnlockOnDestuction= AutoUnlock;
  115.     pPreviewPipeline=NULL; 
  116. };
  117.  
  118. CPipelineLock::~CPipelineLock()
  119. {
  120.     if(Locked && UnlockOnDestuction && pPreviewPipeline)
  121.     {
  122.         switch(Type)
  123.         {
  124.  
  125.         case TYPE_SCENE_WRITE:
  126.             pPreviewPipeline->SceneWriteUnlock(*this);
  127.             break;
  128.         case TYPE_SCENE_READ:
  129.             pPreviewPipeline->SceneReadUnlock(*this);
  130.             break;
  131.         };
  132.     }
  133. }
  134.  
  135. bool CPipeline::SceneReadLock(BOOL WaitForLock, CPipelineLock& Lock)
  136. {
  137.     if(Lock.isLocked()==false)
  138.     {
  139.         if(GetSingleObject(WaitForLock, ReadWriteMutex))
  140.         {
  141.             //EnterCriticalSection(&ZeroSceneReadersSection); //using ReadWriteMutex instead
  142.             if(0==SceneReadersCount)
  143.                 ResetEvent(ZeroSceneReadersEvent);
  144.             ++SceneReadersCount; //InterlockedIncrement(&SceneReadersCount);//using ReadWriteMutex instead
  145.             //LeaveCriticalSection(&ZeroSceneReadersSection); //using ReadWriteMutex instead
  146.  
  147.             ReleaseMutex(ReadWriteMutex);
  148.  
  149.             Lock.Locked=true;
  150.             Lock.Type=CPipelineLock::TYPE_SCENE_READ;
  151.             Lock.pPreviewPipeline=this;
  152.  
  153.             return true;
  154.         }
  155.         else
  156.             return false;
  157.     }
  158.     else
  159.         return false;
  160.  
  161. }
  162.  
  163.  
  164. void CPipeline::SceneReadUnlock(CPipelineLock& Lock)
  165. {
  166.     if(Lock.isLocked()==true && Lock.ofType()==CPipelineLock::TYPE_SCENE_READ)
  167.     {
  168.         EnterCriticalSection(&ZeroSceneReadersSection); 
  169.  
  170.         Lock.Locked=false;
  171.         Lock.pPreviewPipeline=NULL;
  172.         
  173.         if(SceneReadersCount > 0
  174.             && 0== --SceneReadersCount)
  175.         {
  176.             SetEvent(ZeroSceneReadersEvent);
  177.         }
  178.         
  179.         LeaveCriticalSection(&ZeroSceneReadersSection);
  180.     }
  181. }
  182.  
  183. bool CPipeline::IsValid()
  184. {
  185.     return (pPreviewEngine && pDXCCManager && pDXCCRoot);
  186. }
  187.  
  188. HRESULT CPipelineEngineEventsTrigger::RegisterEvents(CPipelineEngineEvents* pCall)
  189. {
  190.     UnregisterEvents(pCall);
  191.     Events.push_back(pCall);
  192.     return S_OK;
  193. }
  194.  
  195. HRESULT CPipelineEngineEventsTrigger::UnregisterEvents(CPipelineEngineEvents* pCall) 
  196. {
  197.     for(UINT i= 0; 
  198.         i < Events.size(); 
  199.         i++)
  200.     {
  201.         const CPipelineEngineEvents* &event= Events.at(i);
  202.         if(event==pCall)
  203.         {
  204.             Events.erase( Events.begin( ) + i);
  205.             return S_OK;
  206.         }
  207.     }
  208.     
  209.     return E_INVALIDARG;
  210. }
  211.  
  212. HRESULT CPipelineManagerEventsTrigger::RegisterEvents(CPipelineManagerEvents* pCall)
  213. {
  214.     UnregisterEvents(pCall);
  215.     Events.push_back(pCall);
  216.     return S_OK;
  217. }
  218.  
  219. HRESULT CPipelineManagerEventsTrigger::UnregisterEvents(CPipelineManagerEvents* pCall)
  220. {
  221.     for(UINT i= 0; 
  222.         i < Events.size(); 
  223.         i++)
  224.     {
  225.         const CPipelineManagerEvents* &event= Events.at(i);
  226.         if(event==pCall)
  227.         {
  228.             Events.erase( Events.begin( ) + i);
  229.             return S_OK;
  230.         }
  231.     }
  232.     
  233.     return E_INVALIDARG;
  234. }
  235.  
  236. HRESULT CPipelineViewerEventsTrigger::RegisterEvents(CPipelineViewerEvents* pCall)
  237. {
  238.     UnregisterEvents(pCall);
  239.     Events.push_back(pCall);
  240.     return S_OK;
  241. }
  242.  
  243. HRESULT CPipelineViewerEventsTrigger::UnregisterEvents(CPipelineViewerEvents* pCall)
  244. {
  245.     for(UINT i= 0; 
  246.         i < Events.size(); 
  247.         i++)
  248.     {
  249.         const CPipelineViewerEvents* &event= Events.at(i);
  250.         if(event==pCall)
  251.         {
  252.             Events.erase( Events.begin( ) + i);
  253.             return S_OK;
  254.         }
  255.     }
  256.     
  257.     return E_INVALIDARG;
  258. }
  259.  
  260.  
  261.  
  262. HRESULT CPipelineEngineEventsTrigger::OnD3DDeviceCreate()
  263. {
  264.     HRESULT hr= S_OK;
  265.     for(UINT i= 0; 
  266.         i < Events.size() 
  267.         && hr == S_OK; 
  268.         i++)
  269.     {
  270.         CPipelineEngineEvents* &event= Events.at(i);
  271.         hr= event->OnD3DDeviceCreate();
  272.     }
  273.     return hr;
  274. };
  275.  
  276. HRESULT CPipelineEngineEventsTrigger::OnD3DDeviceReset()
  277. {
  278.     HRESULT hr= S_OK;
  279.     for(UINT i= 0; 
  280.         i < Events.size() 
  281.         && hr == S_OK; 
  282.         i++)
  283.     {
  284.         CPipelineEngineEvents* &event= Events.at(i);
  285.         hr= event->OnD3DDeviceReset();
  286.     }
  287.     return hr;
  288. };
  289.  
  290. HRESULT CPipelineEngineEventsTrigger::OnD3DDeviceLost()
  291. {
  292.     HRESULT hr= S_OK;
  293.     for(UINT i= 0; 
  294.         i < Events.size() 
  295.         && hr == S_OK; 
  296.         i++)
  297.     {
  298.         CPipelineEngineEvents* &event= Events.at(i);
  299.         hr= event->OnD3DDeviceLost();
  300.     }
  301.     return hr;
  302. };
  303.  
  304. HRESULT CPipelineEngineEventsTrigger::OnD3DDeviceDestroy()
  305. {
  306.     HRESULT hr= S_OK;
  307.     for(UINT i= 0;
  308.         i < Events.size() 
  309.         && hr == S_OK; 
  310.         i++)
  311.     {
  312.         CPipelineEngineEvents* &event= Events.at(i);
  313.         hr= event->OnD3DDeviceDestroy();
  314.     }
  315.     return hr;
  316. };
  317.  
  318.  
  319. HRESULT CPipelineManagerEventsTrigger::OnReload()
  320. {
  321.     HRESULT hr= S_OK;
  322.     for(UINT i= 0; 
  323.         i < Events.size() 
  324.         && hr == S_OK; 
  325.         i++)
  326.     {
  327.         CPipelineManagerEvents* &event= Events.at(i);
  328.         hr= event->OnReload();
  329.     }
  330.     return hr;
  331. };
  332.  
  333. HRESULT CPipelineManagerEventsTrigger::OnResourceAdd(IDXCCResource* pRes)
  334. {
  335.     HRESULT hr= S_OK;
  336.     for(UINT i= 0; 
  337.         i < Events.size() 
  338.         && hr == S_OK; 
  339.         i++)
  340.     {
  341.         CPipelineManagerEvents* &event= Events.at(i);
  342.         hr= event->OnResourceAdd(pRes);
  343.     }
  344.     return hr;
  345. };
  346.  
  347.  
  348. CPipelineManagerEvents::CPipelineManagerEvents()
  349. {
  350.     ExclusiveModeMutex= CreateMutex(NULL, false, NULL);
  351. }
  352.  
  353. CPipelineManagerEvents::~CPipelineManagerEvents()
  354. {
  355.     CloseHandle(ExclusiveModeMutex);
  356.  
  357. }
  358.  
  359.  
  360. HRESULT CPipelineManagerEventsTrigger::OnResourceRecycle(IDXCCResource* pRes)
  361. {
  362.     HRESULT hr= S_OK;
  363.     for(UINT i= 0; 
  364.         i < Events.size() 
  365.         && hr == S_OK; 
  366.         i++)
  367.     {
  368.         CPipelineManagerEvents* &event= Events.at(i);
  369.         hr= event->OnResourceRecycle(pRes);
  370.     }
  371.     return hr;
  372. };
  373.  
  374. HRESULT CPipelineManagerEventsTrigger::OnResourceRemove(IDXCCResource* pRes)
  375. {
  376.     HRESULT hr= S_OK;
  377.     for(UINT i= 0; 
  378.         i < Events.size() 
  379.         && hr == S_OK; 
  380.         i++)
  381.     {
  382.         CPipelineManagerEvents* &event= Events.at(i);
  383.         hr=event->OnResourceRemove(pRes);
  384.     }
  385.     return hr;
  386. };
  387.  
  388. HRESULT CPipelineViewerEventsTrigger::OnFrameChildAdded(IDXCCFrame* pParent, IDXCCFrame* pChild)
  389. {
  390.     HRESULT hr= S_OK;
  391.     for(UINT i= 0; 
  392.         i < Events.size() 
  393.         && hr == S_OK; 
  394.         i++)
  395.     {
  396.         CPipelineViewerEvents* &event= Events.at(i);
  397.         hr= event->OnFrameChildAdded(pParent, pChild);
  398.     }
  399.     return hr;
  400. };
  401.  
  402. HRESULT CPipelineViewerEventsTrigger::OnFrameChildRemoved(IDXCCFrame* pParent, IDXCCFrame* pChild) 
  403. {
  404.     HRESULT hr= S_OK;
  405.     for(UINT i= 0; 
  406.         i < Events.size() 
  407.         && hr == S_OK; 
  408.         i++)
  409.     {
  410.         CPipelineViewerEvents* &event= Events.at(i);
  411.         hr= event->OnFrameChildRemoved(pParent, pChild);
  412.     }
  413.     return hr;
  414. };
  415.  
  416. HRESULT CPipelineViewerEventsTrigger::OnFrameMemberAdded(IDXCCFrame* pParent, IUnknown* pChild)
  417. {
  418.     HRESULT hr= S_OK;
  419.     for(UINT i= 0; 
  420.         i < Events.size() 
  421.         && hr == S_OK; 
  422.         i++)
  423.     {
  424.         CPipelineViewerEvents* &event= Events.at(i);
  425.         hr= event->OnFrameMemberAdded(pParent, pChild);
  426.     }
  427.     return hr;
  428. };
  429.  
  430. HRESULT CPipelineViewerEventsTrigger::OnFrameMemberRemoved(IDXCCFrame* pParent, IUnknown* pChild)
  431. {
  432.     HRESULT hr= S_OK;
  433.     for(UINT i= 0; 
  434.         i < Events.size() 
  435.         && hr == S_OK; 
  436.         i++)
  437.     {
  438.         CPipelineViewerEvents* &event= Events.at(i);
  439.         hr= event->OnFrameMemberRemoved(pParent, pChild);
  440.     }
  441.     return hr;
  442. };
  443.  
  444. HRESULT CPipelineViewerEventsTrigger::OnMeshChange(IDXCCMesh* pMesh)
  445. {
  446.     HRESULT hr= S_OK;
  447.     for(UINT i= 0; 
  448.         i < Events.size() 
  449.         && hr == S_OK; 
  450.         i++)
  451.     {
  452.         CPipelineViewerEvents* &event= Events.at(i);
  453.         hr= event->OnMeshChange(pMesh);
  454.     }
  455.     return hr;
  456. };
  457.  
  458. HRESULT CPipelineViewerEventsTrigger::OnMeshDeclarationChange(IDXCCMesh* pMesh, IDXCCMesh* pOldMesh)
  459. {
  460.     HRESULT hr= S_OK;
  461.     for(UINT i= 0; 
  462.         i < Events.size() 
  463.         && hr == S_OK; 
  464.         i++)
  465.     {
  466.         CPipelineViewerEvents* &event= Events.at(i);
  467.         hr= event->OnMeshDeclarationChange(pMesh, pOldMesh);
  468.     }
  469.     return hr;
  470. };
  471.  
  472. HRESULT CPipelineViewerEventsTrigger::OnMeshTopologyChange(IDXCCMesh* pMesh, IDXCCMesh* pOldMesh)
  473. {
  474.     HRESULT hr= S_OK;
  475.     for(UINT i= 0; 
  476.         i < Events.size() 
  477.         && hr == S_OK; 
  478.         i++)
  479.     {
  480.         CPipelineViewerEvents* &event= Events.at(i);
  481.         hr= event->OnMeshTopologyChange(pMesh, pOldMesh);
  482.     }
  483.     return hr;
  484. };
  485.  
  486. HRESULT CPipelineViewerEventsTrigger::OnMeshVertexChange(IDXCCMesh* pMesh, UINT vertMin, UINT vertMax)
  487. {
  488.     HRESULT hr= S_OK;
  489.     for(UINT i= 0; 
  490.         i < Events.size() 
  491.         && hr == S_OK; 
  492.         i++)
  493.     {
  494.         CPipelineViewerEvents* &event= Events.at(i);
  495.         hr= event->OnMeshVertexChange(pMesh, vertMin, vertMax);
  496.     }
  497.     return hr;
  498. };
  499.  
  500. HRESULT CPipelineViewerEventsTrigger::OnMeshSubVertexChange(IDXCCMesh* pMesh, D3DDECLUSAGE Usage, UINT UsageIndex, UINT vertMin, UINT vertMax)
  501. {
  502.     HRESULT hr= S_OK;
  503.     for(UINT i= 0; 
  504.         i < Events.size() 
  505.         && hr == S_OK; 
  506.         i++)
  507.     {
  508.         CPipelineViewerEvents* &event= Events.at(i);
  509.         hr= event->OnMeshSubVertexChange(pMesh, Usage, UsageIndex, vertMin, vertMax);
  510.     }
  511.     return hr;
  512. };
  513. HRESULT CPipelineViewerEventsTrigger::OnMeshAttributeChange(IDXCCMesh* pMesh, UINT faceMin, UINT faceMax)
  514. {
  515.     HRESULT hr= S_OK;
  516.     for(UINT i= 0; 
  517.         i < Events.size() 
  518.         && hr == S_OK; 
  519.         i++)
  520.     {
  521.         CPipelineViewerEvents* &event= Events.at(i);
  522.         hr= event->OnMeshAttributeChange(pMesh, faceMin, faceMax);
  523.     }
  524.     return hr;
  525. };
  526.  
  527. HRESULT CPipelineViewerEventsTrigger::OnMeshMaterialChange(IDXCCMesh* pMesh, DXCCATTRIBUTE Attrib, ID3DXEffect* pOldMaterial)
  528. {
  529.     HRESULT hr= S_OK;
  530.     for(UINT i= 0; 
  531.         i < Events.size() 
  532.         && hr == S_OK; 
  533.         i++)
  534.     {
  535.         CPipelineViewerEvents* &event= Events.at(i);
  536.         hr= event->OnMeshMaterialChange(pMesh, Attrib, pOldMaterial);
  537.     }
  538.     return hr;
  539. };
  540.  
  541. HRESULT CPipelineViewerEventsTrigger::OnMaterialEffectChange(ID3DXEffect* pMaterial, LPD3DXEFFECT pOldEffect)
  542. {
  543.     HRESULT hr= S_OK;
  544.     for(UINT i= 0; 
  545.         i < Events.size() 
  546.         && hr == S_OK; 
  547.         i++)
  548.     {
  549.         CPipelineViewerEvents* &event= Events.at(i);
  550.         hr= event->OnMaterialEffectChange(pMaterial, pOldEffect);
  551.     }
  552.     return hr;
  553. };
  554.  
  555. HRESULT CPipelineViewerEventsTrigger::OnMaterialParameterChange(ID3DXEffect* pMaterial, D3DXHANDLE hParameter)
  556. {
  557.     HRESULT hr= S_OK;
  558.     for(UINT i= 0; 
  559.         i < Events.size() 
  560.         && hr == S_OK; 
  561.         i++)
  562.     {
  563.         CPipelineViewerEvents* &event= Events.at(i);
  564.         hr= event->OnMaterialParameterChange(pMaterial, hParameter);
  565.     }
  566.     return hr;
  567. };
  568.  
  569.  
  570.  
  571. CBank::CBank()
  572. {
  573.     GroupGenerator= 0;
  574.     ItemGenerator= 0;
  575. };
  576.  
  577. CBank::GroupId
  578. CBank::GenerateGroupId()
  579. {
  580.     return GroupGenerator++;
  581. }
  582.  
  583.  
  584. CBank::CItemBank::CPair* 
  585. CBank::AddItemToGroup(GroupId Gid, void* pValue)
  586. {
  587.     POSITION result = ItemBank.SetAt(ItemGenerator, pValue);
  588.     if(result)
  589.     {
  590.         GroupBank.Insert(Gid, ItemGenerator);
  591.         ItemToGroup.SetAt(ItemGenerator, Gid);
  592.     }
  593.     return ( result ? ItemBank.GetAt(result) : NULL);
  594. }
  595.  
  596.  
  597. void 
  598. CBank::RemoveByItem( ItemId Iid , bool DeleteValue)
  599. {
  600.     POSITION IidToGid= ItemToGroup.Lookup(Iid);
  601.     if(IidToGid)
  602.     {
  603.         GroupId Gid= ItemToGroup.GetAt(IidToGid)->m_value;
  604.  
  605.         for( POSITION pos= GroupBank.FindFirstWithKey(Gid);
  606.             pos != NULL;
  607.             GroupBank.GetNextWithKey(pos, Gid))
  608.         {
  609.             if(Iid == GroupBank.GetValueAt(pos))
  610.             {
  611.                 GroupBank.RemoveAt(pos);
  612.                 break;
  613.             }
  614.         }
  615.  
  616.         ItemToGroup.RemoveAt(IidToGid);
  617.     }
  618.     
  619.     POSITION valuePosition= ItemBank.Lookup(Iid);
  620.     if(valuePosition)
  621.     {
  622.         if(DeleteValue)
  623.         {
  624.             delete ItemBank.GetValueAt(valuePosition);
  625.         }
  626.         ItemBank.RemoveAt(valuePosition);
  627.     }
  628. }
  629.  
  630. void 
  631. CBank::RemoveByGroup( GroupId Gid , bool DeleteValues)
  632. {
  633.     for( POSITION pos= GroupBank.FindFirstWithKey(Gid);
  634.         pos != NULL;
  635.         GroupBank.GetNextWithKey(pos, Gid))
  636.     {
  637.         ItemId Iid = GroupBank.GetValueAt(pos);
  638.  
  639.         ItemToGroup.RemoveKey(Iid);
  640.  
  641.         POSITION valuePosition= ItemBank.Lookup(Iid);
  642.         if(valuePosition)
  643.         {
  644.             if(DeleteValues)
  645.             {
  646.                 delete ItemBank.GetValueAt(valuePosition);
  647.             }
  648.             ItemBank.RemoveAt(valuePosition);
  649.         }
  650.     }
  651.  
  652.     GroupBank.RemoveKey(Gid);
  653. }
  654.  
  655.  
  656. void 
  657. CBank::RemoveAll(bool DeleteValues)
  658. {
  659.     if(DeleteValues)
  660.     {
  661.         for( POSITION pos= ItemBank.GetHeadPosition();
  662.             pos != NULL;
  663.             GroupBank.GetNext(pos))
  664.         {
  665.             delete ItemBank.GetValueAt(pos);
  666.         }
  667.     }
  668.  
  669.     ItemBank.RemoveAll();
  670.     GroupBank.RemoveAll();
  671.     ItemToGroup.RemoveAll();
  672. }
  673.  
  674.